var express = require('express');               //引用express框架
var path = require('path');                     //引用目录
var fs = require('fs');                         //引用FS模块
var sqlite3 = require('sqlite3').verbose();     //数据库连接
var router = express.Router();                  //路由
var pakPath = path.resolve('./pak');            //打开PAK文件夹
var terrainPath = path.resolve('./terrain');    //打开terrain文件夹
var cltPath = path.resolve('./clt');            //打开CLT文件夹
var mbtilesPath = path.resolve('./mbtiles');    //打开CLT文件夹

fs.readdir(pakPath, function (err, files) {                            //确定文件目录有没有文件
  if (files.length === 0) {                                            //文件字节不为空
    console.log("---------------")
    console.log("/pak/文件夹没有pak文件!")
    console.log("---------------")
  } else {                                                             //如果不为空，则执行pakArr
    pakArr(files)
  }
})

fs.readdir(terrainPath, function (err, files) {                        //确定文件目录有没有文件
  if (files.length === 0) {                                            //文件字节不为空
    console.log("---------------")
    console.log("/terrain/文件夹没有terrain的pak文件!")
    console.log("---------------")
  } else {                                                             //如果不为空，则执行pakArr
    terrainArr(files)
  }
})

fs.readdir(cltPath, function (err, files) {                            //确定文件目录有没有文件
  if (files.length === 0) {                                            //文件字节不为空
    console.log('---------------')
    console.log('/clt/文件夹没有pak文件!')
    console.log('---------------')
  } else {                                                             //如果不为空，则执行pakArr
    cltArr(files)
  }
})

fs.readdir(mbtilesPath, function (err, files) {                            //确定文件目录有没有文件
  if (files.length === 0) {                                            //文件字节不为空
    console.log('---------------')
    console.log('/clt/文件夹没有pak文件!')
    console.log('---------------')
  } else {                                                             //如果不为空，则执行pakArr
    mbtilesArr(files)
  }
})

var sqlite3clt = {};                             //文件目录组
function cltArr(files) {                         //files [ 'da.pak', 'earth.pak', 'quan.pak' ]
  for (let i = 0; i < files.length; i++) {       //files[i].split('.')[0]遍历获取文件名，查看打开文件状态
    sqlite3clt[files[i].split('.')[0]] = new sqlite3.Database('./clt/' + files[i], function (err) {
      // console.log(sqlite3clt)                 //返回新的数据库对象并自动打开数据库。没有单独的方法来打开数据库。
      if (err == null) {
        console.log(files[i] + '数据库解析成功')
      } else {
        console.log(files[i] + '数据库解析失败')
      }
    })
  }
}

var sqlite3pak = {};                             //文件目录组
function pakArr(files) {                      //files [ 'da.pak', 'earth.pak', 'quan.pak' ]
  for (let i = 0; i < files.length; i++) {       //files[i].split('.')[0]遍历获取文件名，查看打开文件状态
    sqlite3pak[files[i].split('.')[0]] = new sqlite3.Database('./pak/' + files[i], function (err) {   //返回新的数据库对象并自动打开数据库。没有单独的方法来打开数据库。
      if (err == null) {
        console.log(files[i] + '数据库解析成功')
      } else {
        console.log(files[i] + '数据库解析失败')
      }
    })
  }
}

var sqlite3terrain = {};                             //文件目录组
function terrainArr(files) {                      //files [ 'da.pak', 'earth.pak', 'quan.pak' ]
  for (let i = 0; i < files.length; i++) {       //files[i].split('.')[0]遍历获取文件名，查看打开文件状态
    sqlite3terrain[files[i].split('.')[0]] = new sqlite3.Database('./terrain/' + files[i], function (err) {   //返回新的数据库对象并自动打开数据库。没有单独的方法来打开数据库。
      if (err == null) {
        console.log(files[i] + '数据库解析成功')
      } else {
        console.log(files[i] + '数据库解析失败')
      }
    })
  }
}

var sqlite3mbtiles = {};                             //文件目录组
function mbtilesArr(files) {                      //files [ 'da.pak', 'earth.pak', 'quan.pak' ]
  for (let i = 0; i < files.length; i++) {       //files[i].split('.')[0]遍历获取文件名，查看打开文件状态
    sqlite3mbtiles[files[i].split('.')[0]] = new sqlite3.Database('./mbtiles/' + files[i], function (err) {   //返回新的数据库对象并自动打开数据库。没有单独的方法来打开数据库。
      if (err == null) {
        console.log(files[i] + '数据库解析成功')
      } else {
        console.log(files[i] + '数据库解析失败')
      }
    })
  }
}
//文件目录组
// sqlite3pak={
//   da: Database { open: true, filename: './pak/da.pak', mode: 65542 },
//   earth: Database { open: true, filename: './pak/earth.pak', mode: 65542 },
//   quan: Database { open: true, filename: './pak/quan.pak', mode: 65542 }
// }

function gettablename(x, y, z) {   //表名  参考官方文档PAK 地形影像紧凑存储
  if (z < 10) {                    //如果Z小于10，则是blocks表名
    return 'blocks'                //人如果大于10.则否则 表名 = “blocks_” + tostring(z) + “_” + tostring(x / 512) + “_” + tostring(y / 512)
  } else {
    tx = parseInt(x / 512);
    ty = parseInt(y / 512);
    return 'blocks_' + z + '_' + tx + '_' + ty;
  }
}

function terrainname(x, y, z) {    //表名  参考官方文档PAK 地形影像紧凑存储  注意地形切片和影像切片数据库序列可以通用。不过，地形为TMS经纬度瓦片。请注意，还需要请求layer.json
  if (z < 10) {                    //如果Z小于10，则是blocks表名
    return 'blocks'                //人如果大于10.则否则 表名 = “blocks_” + tostring(z) + “_” + tostring(x / 512) + “_” + tostring(y / 512)
  } else {
    tx = parseInt(x / 512);
    ty = parseInt(y / 512);
    return 'blocks_' + z + '_' + tx + '_' + ty;
  }
}

router.use('/cesiumlab/pak', function (req, res, next) {   //如果以/cesiumlab开头的请求
  let key = req.originalUrl.split('/');                    //hostname:ip/之后的url + 请求参数对
  let objkey = key[3];                                     //key[2]文件名key[3]为Z，key[4]为X，key[5]为Y
  let sqlstr = "select * from " + gettablename(key[5], key[6], key[4]) + ' where x=' + key[5] + " and " + ' y=' + key[6] + " and " + ' z=' + key[4]   //数据库命令                           
  sqlite3pak[objkey].get(sqlstr, function (err, row) { //select * from blocks where x=404 and  y=217 and  z=9
    // console.log(objkey)
    if (err === null) {                                    //如果返回不为空
      if (row !== undefined) {                             //如果返回不为undefined，则设置Access-Control-Allow-Headers: 和Content-Type: 
        res.set('Content-Type', 'image/png');
        res.status(200).send(row.tile)                     //返回tiles的内容
      } else {                                             //如果返回undefined
        res.set('Content-Type', 'image/png');
        res.status(404).send('文件没有找到!');              //返回404
      }
    } else {                                               //如果报错，则404
      res.set('Content-Type', 'image/png');
      res.status(404).send('文件没有找到');
    }
  })
});

router.use('/cesiumlab/terrain', function (req, res, next) {   //如果以/cesiumlab开头的请求
  let key = req.originalUrl.split('/');                        //hostname:ip/之后的url + 请求参数对 
  let objkey = key[3];                                         //key[2]文件名key[3]为Z，key[4]为X，key[5]为Y
  if (key[6] !== undefined) {                                  //如果Y加后缀不为空
    let ter = key[6].split('.');;                              //提取Y值  {y}.terrain
    let sqlstr = "select * from " + terrainname(key[5], ter[0], key[4]) + ' where x=' + key[5] + " and " + ' y=' + ter[0] + " and " + ' z=' + key[4]   //数据库命令    
    sqlite3terrain[objkey].get(sqlstr, function (err, row) { //select * from blocks where x=404 and  y=217 and  z=9
      if (err === null) {                                      //如果返回不为空
        if (row !== undefined) {                               //如果返回不为undefined，则设置Access-Control-Allow-Headers: 和Content-Type: 
          res.set('Content-Type', 'application/vnd.quantized-mesh;extensions=octvertexnormals-watermask-bvh-metadata');
          res.status(200).send(row.tile)                       //返回tiles的内容
        } else {                                               //如果返回undefined
          res.status(404).send('文件没有找到!');                //返回404
        }
      } else {                                                 //如果报错，则404
        res.status(404).send('文件没有找到');
      }
    })
  } else {
    let terstr = "select * from infos where contenttype='quantizedmesh'"    //查询layer.json
    sqlite3terrain[objkey].get(terstr, function (err, row) { //select * from blocks where x=404 and  y=217 and  z=9
      if (err === null) {                                    //如果返回不为空
        if (row !== undefined) {                             //如果返回不为undefined，则设置Access-Control-Allow-Headers: 和Content-Type: 
          res.set('Content-Type', 'application/json');
          res.status(200).send(row.layerjson)                //返回tiles的内容
        } else {                                             //如果返回undefined
          res.set('Content-Type', 'application/json');
          res.status(404).send('文件没有找到!');              //返回404
        }
      } else {                                               //如果报错，则404
        res.set('Content-Type', 'application/json');
        res.status(404).send('文件没有找到');
      }
    })
  }
});

router.use('/cesiumlab/clt', function (req, res, next) {           //如果以/cesiumlab开头的请求
  let keyname = req.originalUrl.split('/');                        //hostname:ip/之后的url + 请求参数对
  let cltkey = keyname[3];                                         //key[2]文件名key[3]为Z，key[4]为X，key[5]为Y
  let sqlstr = "select * from tiles where path=" + "'" + keyname[4] + "'"   //数据库命令
  sqlite3clt[cltkey].get(sqlstr, function (err, row) {             //select * from tiles where path='tileset.json'
    if (err === null) {                                            //如果返回不为空
      if (row !== undefined) {                                     //如果返回不为undefined，则设置Access-Control-Allow-Headers: 和Content-Type: 
        res.set('Content-Encoding', 'gzip');                       //设置http请求头
        res.set('Content-Type', 'application/json; charset=UTF-8');
        res.status(200).send(row.tile);                            //返回tiles的内容
        // console.log(row.tiles)
      } else {                                                     //如果返回undefined
        res.set('Content-Type', 'application/json; charset=UTF-8');
        res.status(404).send('文件没有找到!');                      //返回404
      }
    } else {                                                       //如果报错，则404
      res.set('Content-Type', 'application/json; charset=UTF-8');
      res.status(404).send('文件没有找到');
    }
  })
});

router.use('/cesiumlab/mbtiles', function (req, res, next) {   //如果以/cesiumlab开头的请求
  let key = req.originalUrl.split('/');                    //hostname:ip/之后的url + 请求参数对
  let objkey = key[3];                                     //key[2]文件名key[3]为Z，key[4]为X，key[5]为Y
  let sqlstr = "select * from " + gettablename(key[5], key[6], key[4]) + ' where x=' + key[5] + " and " + ' y=' + key[6] + " and " + ' z=' + key[4]   //数据库命令                           
  sqlite3mbtiles[objkey].get(sqlstr, function (err, row) { //select * from tiles where tile_column=3 and tile_row=2 and zoom_level=2
    // console.log(objkey)
    if (err === null) {                                    //如果返回不为空
      if (row !== undefined) {                             //如果返回不为undefined，则设置Access-Control-Allow-Headers: 和Content-Type: 
        res.set('Content-Type', 'image/png');
        res.status(200).send(row.tile_data)                     //返回tiles的内容
      } else {                                             //如果返回undefined
        res.set('Content-Type', 'image/png');
        res.status(404).send('文件没有找到!');              //返回404
      }
    } else {                                               //如果报错，则404
      res.set('Content-Type', 'image/png');
      res.status(404).send('文件没有找到');
    }
  })
});

module.exports = router;
